home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / m2 / cat3src / cat / groupcom.i < prev    next >
Text File  |  1997-10-26  |  6KB  |  174 lines

  1. IMPLEMENTATION MODULE GroupComment;
  2.  
  3. (*==============================================================*
  4.  * Modul:               gruppenbergreifende Kommentare         *
  5.  * Autor:               Johannes G”ttker-Schnetmann             *
  6.  * erstellt am:         28.12.1991                              *
  7.  * letzte Žnderung am:  30.01.1993                              *
  8.  * Version:             0.1                                     *
  9.  * Interne Version:     V#0002                                  *
  10.  *==============================================================*
  11.   
  12.   Das Problem, aus einem String eine ID und eine Gruppe herauszuholen besteht sowohl
  13.   in data.i als auch in grin.i. In ersterem Modul schon w„hrend des Einfgens,
  14.   dann wird versucht anhand einer solchen Zeile eine Kommentarverkettung herzustellen
  15.   und in grin beim Sprung ber eine gruppenbergreifende Kommentarverkettung.
  16.  
  17.  *----------------------------------------------------------------------------
  18.  * Datum    Vers. Autor  Žnderung (Arbeitsbericht)                            
  19.  *----------------------------------------------------------------------------
  20.  * 28.12.91 0001  JGS    Erste Version
  21.  * 30.01.93 0002  JGS    Gruppennamen werden "geupcased"
  22.  *----------------------------------------------------------------------------
  23.  *)
  24.  
  25. FROM SYSTEM     IMPORT ADDRESS, ADR;
  26. FROM CatTypes   IMPORT Str1023Ptr;
  27. FROM Void       IMPORT v;
  28. IMPORT MagicStrings;
  29.  
  30.   PROCEDURE IDPos(REF str : ARRAY OF CHAR; VAR begin : CARDINAL):BOOLEAN;
  31.   (* Sieht nach, ob mit dem bergebenen String eine Kommentarverkettung hergestellt *)
  32.   (* werden kann. Falls ja, steht der Beginn der ID in <begin>                      *)
  33.   CONST com = 'KOMMENTAR ZU ';
  34.         dem = 'DEMENTI ZU ';
  35.   VAR pos : CARDINAL; vgl : ARRAY[0..14] OF CHAR;
  36.       l   : CARDINAL;
  37.       ok  : BOOLEAN;
  38.   BEGIN
  39.     vgl := com; (* Leider geht com[n] nicht.. :-( *)
  40.     pos := 0;
  41.     l := LENGTH (vgl);
  42.     ok := TRUE;
  43.     WHILE (pos < l) & ok DO
  44.       IF MagicStrings.Cap(str[pos]) # vgl[pos] THEN ok := FALSE END;
  45.       INC (pos);
  46.     END;
  47.     IF ~ok
  48.     THEN
  49.       vgl := dem; (* Leider geht com[n] nicht.. :-( *)
  50.       pos := 0;
  51.       l := LENGTH (vgl);
  52.       ok := TRUE;
  53.       WHILE (pos < l) & ok DO
  54.         IF MagicStrings.Cap(str[pos]) # vgl[pos] THEN ok := FALSE END;
  55.         INC (pos);
  56.       END;
  57.     END;
  58.     IF ~ok THEN RETURN FALSE END;
  59.     (*  
  60.     FOR pos := 0 TO LENGTH(vgl)-1 DO
  61.       IF MagicStrings.Cap(str[pos]) # vgl[pos] THEN RETURN FALSE END;
  62.     END;
  63.     *)
  64.     begin := LENGTH(vgl);
  65.     RETURN TRUE;
  66.   END IDPos;
  67.  
  68.   PROCEDURE stampEnd(VAR str      : Str1023Ptr;
  69.                      VAR saveChar : CHAR;
  70.                      VAR savePos  : CARDINAL;
  71.                      VAR atSign   : BOOLEAN; (* Kam ein '@' vor? *)
  72.                          termChar : CHAR);
  73.   VAR lauf : CARDINAL;
  74.   BEGIN
  75.     (* Hier jetzt noch das Ende suchen.. (Buchstabe ab/unter ' ' = 32C) *)
  76.     lauf := 0;
  77.     atSign := FALSE;
  78.     WHILE (lauf < 1023) & (str^[lauf] > termChar) DO 
  79.       IF str^[lauf] = '@' THEN atSign := TRUE END;
  80.       INC(lauf);
  81.     END;
  82.     saveChar   := str^[lauf];
  83.     savePos    := lauf;
  84.     str^[lauf] := 0C;
  85.   END stampEnd;
  86.  
  87.   PROCEDURE PrepareID(REF pText    : Str1023Ptr;
  88.                       VAR str      : Str1023Ptr;
  89.                       VAR saveChar : CHAR;
  90.                       VAR savePos  : CARDINAL):BOOLEAN;
  91.   (* Aus dem in <str> stehenden String eine ID herausholen oder auch nicht.. :-) *)
  92.   (* In <saveChar> steht anschliežend ein Buchstabe, der bei <savePos> im        *)
  93.   (* entnommen im erfolgreichen Fall wurde *)
  94.   VAR bgn, lauf : CARDINAL; atSign : BOOLEAN;
  95.   BEGIN
  96.     IF (pText^[0] = '-') OR (pText^[0] = 'K') OR (pText^[0] = 'D') THEN
  97.       bgn := 0;
  98.       IF pText^[0] = '-' THEN
  99.         str := pText+ADDRESS(1);
  100.       ELSE
  101.         str := pText;
  102.         IF IDPos(str^, bgn) THEN
  103.           str := ADDRESS(str) + ADDRESS(LONG(bgn));
  104.         ELSE
  105.           RETURN FALSE
  106.         END;
  107.       END;
  108.       stampEnd(str, saveChar, savePos, atSign, ' ');      (* Ende markieren *)
  109.       IF atSign THEN
  110.         RETURN TRUE
  111.       ELSE
  112.         str^[savePos] := saveChar; (* zurcksetzen *)
  113.         RETURN FALSE
  114.       END;
  115.     ELSE
  116.       RETURN FALSE
  117.     END;
  118.   END PrepareID;
  119.   
  120.   PROCEDURE iGroupPos(REF str   : ARRAY OF CHAR;
  121.                      VAR begin : CARDINAL;
  122.                      REF vgl : ARRAY OF CHAR):BOOLEAN;
  123.   VAR pos : CARDINAL;
  124.   BEGIN
  125.     FOR pos := 0 TO LENGTH(vgl)-1 DO
  126.       IF MagicStrings.Cap(str[pos]) # vgl[pos] THEN RETURN FALSE END;
  127.     END;
  128.     begin := LENGTH(vgl);
  129.     RETURN TRUE;
  130.   END iGroupPos;
  131.  
  132.   PROCEDURE GroupPos(REF str   : ARRAY OF CHAR;
  133.                      VAR begin : CARDINAL):BOOLEAN;
  134.   CONST gruppe1 = 'IN DER GRUPPE ';
  135.         gruppe2 = 'IN GRUPPE ';
  136.         gruppe3 = 'IN ';
  137.   BEGIN
  138.     RETURN iGroupPos(str, begin, gruppe1) OR 
  139.            iGroupPos(str, begin, gruppe2) OR
  140.            iGroupPos(str, begin, gruppe3); 
  141.   END GroupPos;
  142.  
  143.  
  144.   PROCEDURE PrepareGroup(REF pStr : Str1023Ptr;
  145.                          VAR str  : Str1023Ptr):BOOLEAN;
  146.   VAR bgn : CARDINAL; old : CHAR; pos : CARDINAL;
  147.   BEGIN
  148.     IF GroupPos(pStr^, bgn) THEN
  149.       str := pStr + ADDRESS(LONG(bgn));
  150.       stampEnd(str, old, pos, v.bool, 37C);
  151.       IF (pos > 0) & (str^[pos-1] = ':') THEN
  152.         str^[pos] := old;
  153.         str^[pos-1] := 0C;
  154.       END;
  155.       MagicStrings.CAPS(str^);
  156.       RETURN TRUE;
  157.     ELSE
  158.       RETURN FALSE;
  159.     END;
  160.   END PrepareGroup;
  161.   
  162.   PROCEDURE PrepareIDnGroup(VAR str      : ARRAY OF CHAR;
  163.                             VAR id       : Str1023Ptr;
  164.                             VAR gr       : Str1023Ptr):BOOLEAN;
  165.   (* Aus dem in <str> stehenden String die ID und Gruppe herausholen oder nicht.    *)
  166.   (* <id> zeigt anschliežend auf die nullterminierte ID                             *)
  167.   (* und <gr> auf die nullterminiert Gruppe innerhalb von <str>                     *)
  168.   BEGIN
  169.     RETURN PrepareID(ADR(str), id, v.char, v.card) & 
  170.            PrepareGroup(ADDRESS(id)+ADDRESS(LONG(LENGTH(id^))+1), gr);
  171.   END PrepareIDnGroup;
  172.  
  173. END GroupComment.
  174.